package com.cncq.flowable.service;

import org.flowable.engine.repository.Deployment;
import org.flowable.engine.runtime.ProcessInstance;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.Map;

/**
 * @author : yaols
 * Desc:
 * Date: 2022.08.02.17:24
 **/
public interface FlowableService {

    /**
     * 通过 InputStream 流部署流程定义
     *
     * @param name     流程模板文件名字
     * @param tenantId 业务系统标识
     * @param category 流程模板文件类别
     * @param in       流程模板文件流
     * @return 部署流程对象，是流程定义、图像、表单等资源的容器
     */
    Deployment deploy(String name, String tenantId, String category, InputStream in);

    /**
     * 启动流程实例
     *
     * @param processDefinitionId 流程定义ID，不能为空.
     * @param variables           流程实例变量。
     * @return 流程实例
     */
    ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables);

    /**
     * 任务反签收
     *
     * @param taskId 任务的id，不能为null.
     */
    void unclaim(String taskId);

    /**
     * 执行任务
     *
     * @param taskId 任务的id，不能为null.
     */
    void complete(String taskId);

    /**
     * 任务委派
     *
     * @param taskId 任务的id，不能为null.
     * @param userId 被委派人ID.
     */
    void delegate(String taskId, String userId);

    /**
     * 任务移交：将任务的所有权转移给其他用户。
     *
     * @param taskId 任务的id，不能为null.
     * @param userId 接受所有权的人.
     */
    void setAssignee(String taskId, String userId);

    /**
     * 委派任务完成，归还委派人
     *
     * @param taskId 任务的id，不能为null.
     */
    void resolveTask(String taskId);

    /**
     * 任务撤回
     *
     * @param processInstanceId 流程实例ID.
     * @param currentActivityId 当前活动任务ID.
     * @param newActivityId     撤回到达的任务ID.
     */
    void withdraw(String processInstanceId, String currentActivityId, String newActivityId);


    /**
     * 生成流程图
     *
     * @param processId 任务ID
     */
    public void genProcessDiagram(HttpServletResponse httpServletResponse, String processId) throws Exception;
}
